package com.bombitarodriguez.dominio.armas;

import java.io.IOException;
import java.util.Iterator;

import com.bombitarodriguez.dominio.Casillero;
import com.bombitarodriguez.dominio.Juego;
import com.bombitarodriguez.dominio.Mapa;
import com.bombitarodriguez.dominio.Posicion;
import com.bombitarodriguez.interfaces.ObjetoReaccionable;
import com.bombitarodriguez.vista.VistaProyectil;

import fiuba.algo3.titiritero.modelo.ObjetoVivo;


/**
 * 
 *
 */
public class Proyectil extends Arma 
implements ObjetoVivo{
	private Integer velocidad;
	private Integer distanciaARecorrer;
	private Integer distanciaRecorrida;
	private Posicion direccionDelProyectil;

	@SuppressWarnings("unused")
	private Proyectil(){
		//no quiero que se instancie un proyectil sin direccion
	}
	public Proyectil(Posicion direccion){
		distanciaRecorrida = 0;
		destruccion = Juego.DANIO_PROYECTIL;
		ondaExpansiva = Juego.ONDA_EXPANSIVA_PROYECTIL;
		velocidad = Juego.VELOCIDAD_CAMINA;
		distanciaARecorrer = Juego.DISTANCIA_MAXIMA_PROYECTIL;
		direccionDelProyectil = direccion;
		try {
			miVista = new VistaProyectil(this);
		} catch (IOException e) {
			e.printStackTrace();
		}
	}
	
	public Integer getVelocidad(){
		return velocidad;
	}
	
	public void moverProyectil(){
		if (distanciaRecorrida < distanciaARecorrer)
			mover();
		else
			explotar();
		
	}
	private void mover() {
		Integer nuevoX = ( casilleroContenedor.getPosicion().getPosX() 
				+ direccionDelProyectil.getPosX() );
		Integer nuevoY= ( casilleroContenedor.getPosicion().getPosY() 
				+ direccionDelProyectil.getPosY() );
		Posicion nuevaPosicion = new Posicion(nuevoX , nuevoY);
		if ( Posicion.posicionValida(nuevaPosicion )){
			Casillero nuevoCasillero = Mapa.getMapa().getCasillero(nuevaPosicion);
			intentarTrasladarme(nuevoCasillero);
		}
		else
			explotar();
		
	}
	private void intentarTrasladarme(Casillero nuevoCasillero) {
		Iterator<ObjetoReaccionable> iterador = 
				nuevoCasillero.getObjetos().iterator();
		if (interactuarConLosObjetos(iterador)) {
			Mapa.getMapa().reposicionar(this, nuevoCasillero);
		}
		
	}
	private boolean interactuarConLosObjetos(Iterator<ObjetoReaccionable> iterador) {
		Boolean permitePasar = true;
		while (iterador.hasNext() && (permitePasar)) {
			permitePasar = iterador.next().reaccionarCon(this);
		}
		return permitePasar;
	}
	@Override
	public Boolean reaccionarCon(Bomba bomba) {
		bomba.explotar();
		this.explotar();
		return false;
	}
	@Override
	public void vivir() {
		moverProyectil();
		
	}

	
}
